# 智能送药小车 - 极简红线检测版本
# 功能：只检测红线存在与否，有红线发送RED,1，无红线发送NONE,0

import sensor
import time
from pyb import UART

# 初始化UART用于与STM32通信
uart = UART(3, 115200)

# 红色阈值 (需要根据实际红色胶带调整)
# LAB颜色空间: (L_min, L_max, A_min, A_max, B_min, B_max)
# 这个阈值可能需要根据您的红色胶带进行调整
red_threshold = (10, 70, 15, 70, 10, 60)

# 摄像头初始化
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)  # 320x240分辨率
sensor.skip_frames(time=2000)
sensor.set_auto_gain(False)  # 关闭自动增益
sensor.set_auto_whitebal(False)  # 关闭自动白平衡

# ROI区域设置 - 只检测画面下半部分
LINE_ROI = (0, 120, 320, 120)    # 检测区域（画面下半部分）

# 发送计数器，用于控制发送频率
send_counter = 0

def detect_red_line():
    """简单检测红色线段是否存在"""
    global send_counter
    
    img = sensor.snapshot()
    
    # 在ROI区域寻找红色区域
    blobs = img.find_blobs([red_threshold], 
                          roi=LINE_ROI,
                          pixels_threshold=20,   # 降低像素阈值
                          area_threshold=20,     # 降低面积阈值
                          merge=True)
    
    # 绘制检测区域
    img.draw_rectangle(LINE_ROI, color=(255, 255, 0))
    
    has_red = False
    
    if blobs:
        # 找到任何红色区域就认为有红线
        largest_blob = max(blobs, key=lambda b: b.pixels())
        
        # 绘制识别结果
        img.draw_rectangle(largest_blob.rect(), color=(0, 255, 0))
        img.draw_cross(largest_blob.cx(), largest_blob.cy(), color=(255, 0, 0))
        
        has_red = True
    
    # 控制发送频率，每3次检测发送一次结果
    send_counter += 1
    if send_counter >= 3:
        send_counter = 0
        if has_red:
            uart.write("RED,1\r\n")
            print("发送: RED,1")
        else:
            uart.write("NONE,0\r\n")
            print("发送: NONE,0")
    
    return has_red

# 主循环
while True:
    # 检测红线
    has_red_line = detect_red_line()
    
    # 在图像上显示检测结果
    if has_red_line:
        print("检测到红线")
    else:
        print("未检测到红线")
    
    # 控制循环频率
    time.sleep(50)  # 50ms延时
